■ オルタネートスイッチによるLEDの点灯、消灯
最初の入力検出としてはオルタネートスイッチを使った回路がよいと思います。オルタネートスイッチでLEDを点灯、
消灯させる回路を以下に示します。
モーメンタリースイッチを使ってLEDを確実に点灯、消灯させるのはチャタリングがあるので結構難しいものになります。
■ PICの入力ポートの入力検出方法の習得 <CCS編> <C18編> <C30 dsPIC編> <C30 PIC24編> <HI-TECH編>
<試作品仕様>
・ 電源(+5V)を入れたあと、オルタネートスイッチをONすると、LEDが点灯すること
逆にOFFするとLEDが消灯すること
CCSコンパイラの場合の例を以下に示します。
<試作品回路図>
PIC16F84をつかった場合の回路図を以下に示します。(→回路図のPDFファイル)
<試作品外観>
<プログラム例> #include <16f84a.h> // PIC16F84のヘッダーファイル読込み #use delay(clock=10000000) // 外部発振周波数を10MHzに設定 main() { while(1) { if(input(PIN_B3) == 0)output_low(PIN_A2); // RA2ビットへの出力LOW(0V)命令 → LED 点灯 else output_high(PIN_A2); // RA2ポートへの出力High(5V)命令 → LED 消灯 } return 0; // int main()なので 戻り値がないとコンパイラの警告がでる }
(2) C18編
C18コンパイラの例を以下に示します
<試作品回路図>(→回路図のPDFファイル)
PIC18F4550をつかった場合の回路図を以下に示します。
<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
<プログラム例> /* オルタネートSWによる LED ON/OFF */ #include <p18f4550.h> #pragma config PLLDIV = 5 //96MHz PLL Prescalar(1、2、3、4、5、6、10、12のみ) : 外部周波数÷4MHz //20MHz ÷ 5 = 4MHz → 96MHz(=4MHz×24 :固定) #pragma config USBDIV = 2 // Full Speed USB Clock Source Selection : 2(constant) #pragma config CPUDIV = OSC1_PLL2 //CPU System Clock Postscaler // PICのUSB制御用クロック周波数:48MHz(=96MHz ÷2) #pragma config FOSC = HS // システムクロック=20MHz //#pragma config FOSC = HSPLL_HS // システムクロック=48MHz #pragma config WDT = OFF //ウォッチドックタイマ OFF #pragma config LVP = OFF //Low Voltage Program OFF void main (void) { TRISB = 0x00;// B portを出力モードに設定 TRISC = 0b00000010;// C portのRC1を入力モードに設定 while (1) //入力信号をチェックし続ける { if(PORTCbits.RC1 == 0)LATBbits.LATB2 = 0; // CポートのRCビットが0なら BポートのRB2ビットを0にする → LED点灯 else LATBbits.LATB2 = 1; //LED消灯 } }
XC8コンパイラによる PIC18 の例を以下に示します
<試作品回路図>(→回路図のPDFファイル)
<試作品外観> 下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
<プログラム例> #include <p18f14K50.h> #include <xc.h> long int Clock = 48; //12MHz x 4(PLL) = 48MHz long Count_delay; #define _XTAL_FREQ 48000000 #pragma config CPUDIV = NOCLKDIV ,USBDIV = OFF,PCLKEN = ON #pragma config FOSC = HS,PLLEN = ON, HFOFST = OFF //PLL ON Periferal= 12MHz x 4 = 48MHz #pragma config PWRTEN = ON, BOREN = OFF, MCLRE = OFF, BORV = 30 #pragma config WDTEN = OFF,LVP = OFF,FCMEN = OFF, IESO = OFF #pragma config CP0 = OFF,XINST = OFF #pragma config STVREN = OFF, BBSIZ = OFF,CPB = OFF,CP1 = OFF,CPD = OFF //省略するとwarnig がでる #pragma config WRT0 = OFF,WRT1 = OFF,WRTC = OFF,WRTB = OFF,EBTR0 = OFF,EBTR1 = OFF,EBTRB = OFF //省略するとwarnig がでる int main() { ANSEL = 0x00; // デジタルに設定 TRISC = 0b00100000; //RC5: in LATCbits.LATC0 = 0; //Led RC0 : OFF LATCbits.LATC1 = 0; LATCbits.LATC2 = 0; LATCbits.LATC3 = 0; while(1) { if(PORTCbits.RC5 == 0) //SW ONの場合 { LATCbits.LATC0 = 1; //Led RC0 : ON LATCbits.LATC1 = 1; LATCbits.LATC2 = 1; LATCbits.LATC3 = 1; } else { LATCbits.LATC0 = 0; //Led RC0 : OFF LATCbits.LATC1 = 0; LATCbits.LATC2 = 0; LATCbits.LATC3 = 0; } } return 0; }
(3) C30 dsPIC編
C30コンパイラによる dsPIC の例を以下に示します
<試作品回路図>(→回路図のPDFファイル)
dsPIC30F2012をつかった場合の回路図を以下に示します。
<試作品外観>PICへの書き込みはICSPでおこなっています。ICSP用のコネクタは写真には写っていません。
<プログラム例> ///************************************************************/ // LEDの オルタネートスチッチによるON/OFF //************************************************************/ #include "p30f2012.h" #define Clock 117920000 // 単位はHzで指定 _FOSC(CSW_FSCM_OFF & // クロック切り替えなし、フェースセイフクロックモニタなし FRC_PLL16 //内臓高速RC発振器(7.37MHz)、PLL:16倍 → システムクロック周波数=7.37×16=117.92MHz ); _FWDT(WDT_OFF); _FBORPOR(PBOR_ON & //ブラウンアウトリセット機能:ON BORV_42 & //ブラウンアウト電圧:4.2V PWRT_64 & //パワーオンリセットタイマ64msec MCLR_EN //MCLR機能:ON ); _FGS(CODE_PROT_OFF); //コードプロテクト:OFF /// メイン関数 int main(void) { TRISC = 0X0000; //Cポートを出力モードに設定 TRISD = 0xFFFF; //Dポートを入力モードに設定 while(1) { if(PORTDbits.RD8 == 1)LATCbits.LATC13 = 1; // SW ON(RUN側)の場合 // LED2(緑LED)→OFF LED1(赤LED)→ON else LATCbits.LATC13 = 0; // SW OFF(LOAD側)の場合 // LED2(緑LED)→ON LED1(赤LED)→ OFF } return 0; }
(4) C30 PIC24編
C30コンパイラ PIC24FJ64GA002の例を紹介します。
<試作品回路図>(→回路図のPDFファイル)
<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
<プログラム例> ///************************************************************/ // LEDの オルタネートスチッチによるON/OFF //************************************************************/ #include "p24FJ64GA002.h" #define Clock 32000000 // 単位はHzで指定 /// コンフィギュレーション ビットの設定 _CONFIG1( JTAGEN_OFF & //JTAGポート: OFF GCP_OFF & //コードプロテクト: OFF GWRP_OFF & //書き込みプロテクト: OFF BKBUG_OFF & //バックグランドデバック: OFF COE_OFF & //クリップオン エミュレーション: OFF ICS_PGx1& //ICDピンの選択: EMUC/EMUDをPGC1/PGD1と共用 FWDTEN_OFF )//ウォッチドックタイマ: OFF _CONFIG2( IESO_OFF & // 2速度スタートアップ機能:OFF FNOSC_FRCPLL & //内臓高速RC発振(8MHZ)回路 + 4倍PLL → 32MHz(= 8MHz × 4) FCKSM_CSDCMD & //クロック切替え制御:OFF クロックモニタ:OFF OSCIOFNC_OFF & //OSCO/RC15 function: OSCO or Fosc/2 IOL1WAY_OFF & //RP Register Protection: Unlimited Writes To RP Registers I2C1SEL_PRI & //I2C1 pins Select: Use Primary I2C1 pins POSCMOD_NONE) //発振回路モード Oscillator Selection: Primary disabled /// メイン関数 int main(void) { AD1PCFG = 0xFFFF; //AD1PCFGレジスタ: Aポートをアナログで使用するかデジタルで使用するかの設定レジスタ //全ポートデジタルポートに指定(デフォルトはアナログ故デジタルで使用するときは必須) TRISA = 0xFFFF; //Aポートを入力モードに設定 TRISB = 0x0000; //Bポートを出力モードに設定 while(1) { if(PORTAbits.RA0 == 1)LATBbits.LATB15 = 1; // AポートのRA0がOFFなら BポートのRB15 OFF: // LED → OFF else LATBbits.LATB15 = 0; // LED → ON } return 0; }
(5) PIC32MX編
PIC32MX460F512 C32コンパイラの場合の例を紹介します。
<試作品回路図>(→回路図のPDFファイル)
<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
<プログラム例> // PIC32MX460F512L SWによる LED ON/OFF // #include <proc/p32mx460f512l.h> //PIC32MX460F512L #include <plib.h> // PIC32 peripheral library //for SYSTEMConfigPerformance() // コンフィギュレーション設定 // CPU=80MHz Peri=80MHz,HS+PLL,Divider=1/2,PLL=x20,WDT=Off #pragma config FNOSC=PRIPLL, POSCMOD=HS, FPLLIDIV=DIV_2 #pragma config FPLLMUL=MUL_20, FPBDIV=DIV_1, FPLLODIV=DIV_1 #pragma config FWDTEN=OFF, ICESEL=ICS_PGx2 int Clock = 80000000; //80MHz int main(void) { SYSTEMConfigPerformance(80000000); // システム最適化 DDPCONbits.JTAGEN = 0; //I/OポートとしてRA0、RA1、RA4、RA5をつかう場合、電源投入後DDPCONレジスタのbit3を0に、設定する必要があり;ます。 //From the data sheet //"JTAG program/debug port is multiplexed with port pins RA0, RA1, RA4 and RA5 on 100-pin devices. // At power-on-reset, these pins are controlled by the JTAG port. To use these pins for general purpose I/O, // the user’s application code must clear JTAGEN (DDPCON<3>) bit = 0. To use these pins for JTAG program/debug, // the user’s application code must maintain JTAGEN bit = 1." TRISAbits.TRISA4 = 0; //Aポートbit4を出力モードに設定 TRISAbits.TRISA5 = 0; TRISAbits.TRISA6 = 0; TRISAbits.TRISA7 = 0; TRISEbits.TRISE8 = 1;//Eポートbit8を入力モードに設定 while(1) { if(PORTEbits.RE8 == 0) //SW1=ON { LATAbits.LATA4 = 1; // RA4 LED点灯 LATAbits.LATA5 = 1; LATAbits.LATA6 = 1; LATAbits.LATA7 = 1; } else //SW1=OFF { LATAbits.LATA4 = 0; // RA4 LED消灯 LATAbits.LATA5 = 0; LATAbits.LATA6 = 0; LATAbits.LATA7 = 0; } } }
PIC16F1937の例を紹介します。
試作品回路図(→PDFファイル)
<試作品外観>下記の写真には上記回路図にはない、また本テーマと関係のない部品が多々写っています
<プログラム例> //HI-TEC LED SW ON_OFF //Delay style Time 2sec: On Time 1sec,Off Time 1sec // PIC16F1937 #include <htc.h> #define _XTAL_FREQ 20000000 //Ceramic :20MHz //Configuration __CONFIG( FOSC_HS & // EXTRC Oscillator, RC on RA7/OSC1/CLKIN WDTE_OFF & // Power-up Timer Enable bit// PWRT disabled PWRTE_ON & // MCLR Pin Function Select// RE3/MCLR/VPP pin function is MCLR MCLRE_ON & // RE3/MCLR/VPP pin function is digital input CP_OFF & // Program memory code protection is enabled CPD_OFF & // Data memory code protection is enabled BOREN_OFF & // Clock Out Enable bit// CLKOUT function is disabled. I/O or oscillator function on RA6/CLKOUT CLKOUTEN_OFF & // CLKOUT function is enabled on RA6/CLKOUT pin IESO_OFF & // Fail Clock Monitor Enable// Fail-Safe Clock Monitor is enabled FCMEN_ON // Fail-Safe Clock Monitor is disabled ); __CONFIG( WRT_OFF & // 000h to 1FFh write protected, 200h to 1FFFh may be modified by EECON control PLLEN_OFF & // 4x PLL disabled STVREN_OFF &// Brown-out Reset Voltage selection// Brown-out Reset Voltage (VBOR) set to 1.9 V BORV_19 & // Brown-out Reset Voltage (VBOR) set to 2.7 V // DEBUG_OFF & // Background debugger is enabled LVP_OFF // HV on MCLR/VPP must not be used for programming ); void main() { TRISD = 0; //D port: outport TRISC = 0xFF; // C port inport while(1) { if(RC0 == 0) //SW : off // if(PORTCbits.RC0 == 0) // これもOK { LATD0 = 1; //RD0 port LED off LATD1 = 1; //RD1 port LED off LATD2 = 1; //RD2 port LED off LATD7 = 1; //RD7 port LED off } else // SW : on { LATD0 = 0; //RD0 port LED on LATD1 = 0; //RD1 port LED on LATD2 = 0; //RD2 port LED on LATD7 = 0; //RD7 port LED on } } }